package array.matrix;
/*给你一个正整数 n ，生成一个包含 1 到 n2 所有元素，且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。*/
public class lc59 {
    public static void main(String[] args) {
        int n=10;
       int[][] a=generateMatrix(n);
        for (int i = 0; i <n ; i++) {
            for (int j = 0; j <n ; j++) {
                System.out.print(a[i][j]+" ");
                if(j==n-1) System.out.println();
            }
        }

    }
    public static int[][] generateMatrix(int n) { //把握循环不变量，左闭右开
        int[][] a=new int[n][n];
        if(n==1){
            a[0][0]=1;
        }else{
            int lay;//层数
            if(n%2==0){
                lay=n/2;
            }else{
                lay=n/2+1;
                a[n/2][n/2]=n*n;  //当层数为奇数的时候，将正中间的数字直接填上
            }

            int num=1;
            int count=n;//一条边的长度，初始为n，下一层为n-2  n-4 n-6....
            int flag=1;  //表示此时正在填充填充第n条边
            for (int i = 1; i <=lay ; i++) { //第i层
                    flag=1;
                    if(flag==1){  //第一条边，横着填充count-1个数字
                        for (int k = 1; k <=count-1; k++) {
                            a[i-1][i-1+k-1]=num;
                            num++;
                        }
                    }
                    flag++;
                    if(flag==2){//第二条边，竖着填充count-1个数字
                        for (int j = 1; j <=count-1 ; j++) {
                            a[i-1+j-1][n-i]=num;
                            num++;
                        }
                    }
                    flag++;
                    if(flag==3){
                        for (int j = 1; j <=count-1 ; j++) {
                            a[n-i][n-i-j+1]=num;
                            num++;
                        }
                    }
                    flag++;
                    if(flag==4){
                        for (int j = 1; j <=count-1 ; j++) {
                            a[n-i-j+1][i-1]=num;
                            num++;
                        }
                    }
                count=count-2;
            }
        }
     return a;
    }
}
